
package com.jf.cloud.combo.service;

import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.database.vo.PageVO;
import com.jf.cloud.common.product.dto.ComboDTO;
import com.jf.cloud.common.product.vo.ComboVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 商品套餐
 *
 * @author zz
 * @date 2022-08-16 09:18:06
 */
public interface ComboService {

    /**
     * 分页获取商品套餐列表
     * @param pageDTO 分页参数
     * @return 商品套餐列表分页数据
     */
    PageVO<ComboVO> page(PageDTO pageDTO, ComboDTO comboDTO);

    /**
     * 根据商品套餐id获取商品套餐
     *
     * @param comboId 商品套餐id
     * @return 商品套餐
     */
    ComboVO getByComboId(Long comboId,Integer sysType);

    /**
     * 获取套餐信息
     * @param comboDTO
     * @return
     */
    ComboVO pcGetCombo(ComboDTO comboDTO, Integer sysType);

    /**
     * 保存商品套餐
     * @param comboDTO 商品套餐
     */
    void save(ComboDTO comboDTO);

    /**
     * 更新商品套餐
     * @param comboDTO 商品套餐
     */
    void update(ComboDTO comboDTO);
//
//    /**
//     * 根据商品套餐id删除商品套餐
//     * @param comboId 商品套餐id
//     */
//    void deleteById(Long comboId);

    /**
     * 修改商品套餐状态
     * @param comboId
     * @param status
     */
    void updateComboStatus(Long comboId,Integer status);

    /**
     * 根据商品id获取套餐信息
     * @param spuId
     * @return
     */
    List<ComboVO> comboVoListBySpuId(Long spuId);

    /**
     *   根据spuId获取相关的套餐信息
     * @param shopId
     * @param spuId
     * @return
     */
    List<ComboVO> listComboInfoBySpuId(Long shopId, Long spuId);

    /**
     * 定时任务  套餐活动结束，修改套餐状态、套餐商品项状态、套餐商品sku项状态
     */
    void comboEndOperation();

    /**
     * 定时任务 开启 到了活动开始时间未开启的套餐
     */
    void enableCombo();

    /**
     * 套餐销量增加
     * @param combo
     */
    void comboSoldNumAdd(List<ComboDTO> combo);

    /**
     * 商品下架时如果商品在套餐活动中且为主商品则失效套餐活动
     * @param spuId
     */
    void offComboMainSpu(Long spuId);

    /**
     * 检查商品是否为套餐活动（状态正在进行中的）的商品
     * @param spuId
     * @return
     */
    Boolean checkComboSpu(Long spuId,Long shopId);

    /**
     * 根据套餐id集合检查套餐是否全部可用
     * @param comboIdList
     * @return 返回不可用套餐数量 0代表全部可用，其它数据代表有不可用的套餐
     */
    Integer checkComboIsUsable(List<Long> comboIdList);

    /**
     * 根据商品id清除缓存
     * @param spuId
     */
    void removeComboSpuCache(Long spuId);

    /**
     * 根据套餐id集合获取套餐信息
     * @param comboIdList
     * @return
     */
    List<ComboVO> getComboByComboIdList(@Param("comboIdList") List<Long> comboIdList);
}
